package com.example.apidocserver.domain.document.event;

import com.example.apidocserver.domain.document.entity.ApiParam;
import com.example.apidocserver.domain.document.entity.ApiParamField;
import com.example.apidocserver.interfaces.vo.ApiInfoAllVo;
import com.example.apidocserver.interfaces.vo.ApiParamDescVo;

import java.util.Date;
import java.util.List;

/**
 * 字段说明领域事件
 *
 * @author xyqlg
 */
public interface FieldParamDomainEvent {
    /**
     * 比较已有参数说明
     *
     * @param result  参数说明
     * @param addFlag 是否直接增加
     */
    void upsertParamDesc(ApiInfoAllVo result, boolean addFlag);

    /**
     * 设置接口参数说明、字段说明
     *
     * @param apiInfoAllVo 参数信息
     */
    void setParamDesc(ApiInfoAllVo apiInfoAllVo);

    /**
     * 修改参数说明
     *
     * @param paramDescVo 参数说明
     * @return 参数说明
     */
    ApiParam upsertParamDesc(ApiParam paramDescVo);

    /**
     * 收缩相似字段
     *
     * @param world   字段
     * @param apiId   接口id
     * @param spaceId 工作空间id
     * @return 字段集合
     */
    List<ApiParamField> findLikeFields(String world, Integer apiId, Integer spaceId);

    /**
     * 根据uniKey查询接口数据
     *
     * @param field 字段对象
     * @return 字段对象
     */
    ApiParamField findByUniKey(ApiParamField field);

    /**
     * 查询工作空间所有字段说明
     *
     * @param spaceId 工作空间id
     * @return 字段说明集合
     */
    List<ApiParamField> findBySpaceId(Integer spaceId);

    /**
     * 删除参数说明中的字段说明
     *
     * @param fieldId 字段id
     * @return 是否删除成功
     */
    boolean deleteById(Integer fieldId);

    /**
     * 修改字段说明
     *
     * @param field 字段说明对象
     */
    void upsertOne(ApiParamField field);

    /**
     * 批量插入参数说明、参数字段说明
     * 只有新增的接口才会使用该方法增加参数说明，不会判断参数说明是否存在
     *
     * @param apiParamDescList 参数说明对象集合
     * @param userId           用户id
     * @param now              当前时间
     */
    void insertBatchForInput(List<ApiParamDescVo> apiParamDescList, Integer userId, Date now);
}
